﻿using System;

// 形状接口，定义所有形状共有的功能
public interface BShape
{
    double CalculateArea();
    bool IsValid();
    string Name { get; }
}

// 抽象基类，实现接口并提供一些共用功能
public abstract class Shape : BShape
{
    public abstract double CalculateArea();//抽象方法，子类实现
    public abstract bool IsValid();
    public abstract string Name { get; }

    public override string ToString()
    {
        return $"{Name}   面积: {CalculateArea():F2}  是否有效: {IsValid()}";
    }
}

// 长方形类
public class Rectangle : Shape
{
    // 自动属性，包含私有字段和访问器
    public double Length { get; set; }
    public double Width { get; set; }

    public override string Name => "长方形";//override是重写方法

    // 构造函数
    public Rectangle(double length, double width)
    {
        Length = length;
        Width = width;
    }

    // 实现抽象方法：计算面积
    public override double CalculateArea()
    {
        return Length * Width;
    }

    // 实现抽象方法：验证形状是否有效
    public override bool IsValid()
    {
        return Length > 0 && Width > 0;
    }
}

// 正方形类（继承自长方形）
public class Square : Rectangle
{
    public override string Name => "正方形";

    // 边长属性（重写父类的Length和Width的设置器，使它们保持同步）
    private double _side;

    public double Side
    {
        get => _side;
        set
        {
            _side = value;
            base.Length = value;
            base.Width = value;
        }
    }

    // 构造函数
    public Square(double side) : base(side, side)
    {
        _side = side;
    }

    // 重写Length属性，使其与Side保持同步
    public new double Length
    {
        get => _side;
        set
        {
            _side = value;
            base.Length = value;
            base.Width = value;
        }
    }

    // 重写Width属性，使其与Side保持同步
    public new double Width
    {
        get => _side;
        set
        {
            _side = value;
            base.Length = value;
            base.Width = value;
        }
    }
}

// 三角形类
public class Triangle : Shape
{
    public double SideA { get; set; }
    public double SideB { get; set; }
    public double SideC { get; set; }

    public override string Name => "三角形";

    // 构造函数
    public Triangle(double sideA, double sideB, double sideC)
    {
        SideA = sideA;
        SideB = sideB;
        SideC = sideC;
    }

    // 实现抽象方法：计算面积（使用海伦公式）
    public override double CalculateArea()
    {
        if (!IsValid())
            return 0;

        // 半周长
        double s = (SideA + SideB + SideC) / 2;
        // 海伦公式
        return Math.Sqrt(s * (s - SideA) * (s - SideB) * (s - SideC));
    }

    // 实现抽象方法：验证三角形是否有效（三角形任意两边之和大于第三边）
    public override bool IsValid()
    {
        return SideA > 0 && SideB > 0 && SideC > 0 &&
               SideA + SideB > SideC &&
               SideA + SideC > SideB &&
               SideB + SideC > SideA;
    }
}

// 主程序（用于测试）
class Program
{
    static void Main(string[] args)
    {
        // 创建各种形状
        BShape[] shapes = new BShape[]
        {
            new Rectangle(5, 1),
            new Square(2),
            new Triangle(3, 4, 5),
            // 无效形状示例
            new Rectangle(3, -1),
            new Triangle(1, 3, 10)
        };

        // 显示每个形状
        foreach (var shape in shapes)
        {
            Console.WriteLine(shape);
        }
    }
}